import { _decorator, Component, Node, director, Button, Director } from 'cc';
import { AudioManager } from './AudioManager';
const { ccclass, property } = _decorator;

/**
 * 游戏管理器
 * 负责管理游戏状态、分数和全局游戏逻辑
 */
@ccclass('GameManager')
export class GameManager extends Component {
    // 游戏配置参数
    @property({type: Number, tooltip: "棋盘大小（格子数量）"})
    public readonly boardSize: number = 8;
    
    @property({type: Number, tooltip: "游戏时间（秒）"})
    public readonly maxTime: number = 60;
    
    @property({type: Number, tooltip: "可用道具数量"})
    public readonly maxItems: number = 3;
    
    // 游戏状态
    private _score: number = 0;
    private _isGameOver: boolean = false;
    private _remainingTime: number = 0;
    private _isPaused: boolean = false;
    
    // 生命周期函数
    onLoad() {
        // 注册全局按钮点击音效
        this.registerGlobalButtonSound();
    }
    
    /**
     * 注册全局按钮点击音效
     */
    private registerGlobalButtonSound(): void {
        // 监听全局按钮点击事件
        director.on(Button.EventType.CLICK, this.onGlobalButtonClick, this);
    }
    
    /**
     * 全局按钮点击处理函数
     */
    private onGlobalButtonClick(button: Button): void {
        // 播放按钮点击音效
        const audioManager = this.getAudioManager();
        if (audioManager && audioManager.isSoundEnabled()) {
            audioManager.playSound('button_click_ok');
        }
    }
    
    onDestroy() {
        // 移除全局事件监听
        director.off(Button.EventType.CLICK, this.onGlobalButtonClick, this);
        director.off(Director.EVENT_AFTER_SCENE_LAUNCH, this.onSceneChanged, this);
    }
    
    /**
     * 场景切换后处理
     */
    private onSceneChanged() {
        console.log("场景已切换，确保GameManager正常工作");
        
        // 重新注册按钮点击事件（避免在场景切换后事件监听失效）
        this.registerGlobalButtonSound();
    }
    
    start() {
        // 游戏初始化
        this.resetGame();
    }
    
    /**
     * 获取当前场景中的AudioManager引用
     */
    private getAudioManager(): AudioManager {
        // 查找当前场景中的AudioManager组件
        const audioManagerNode = director.getScene().getChildByName('AudioManager');
        if (audioManagerNode) {
            return audioManagerNode.getComponent(AudioManager);
        }
        return null;
    }
    
    // 游戏逻辑方法
    public resetGame(): void {
        console.log("重置游戏状态");
        this._score = 0;
        this._isGameOver = false;
        this._remainingTime = this.maxTime;
        this._isPaused = false;
    }
    
    public startGame(): void {
        // 开始游戏逻辑
        this.resetGame();
        console.log("游戏开始，时间:", this._remainingTime);
        // 这里可以调用其他管理器的方法
    }
    
    public endGame(): void {
        if (this._isGameOver) return; // 防止重复结束
        
        this._isGameOver = true;
        // 游戏结束逻辑
        console.log("游戏结束，最终分数:", this._score);
        // 可以触发游戏结束事件或者调用UI显示结束界面
    }
    
    /**
     * 增加游戏分数
     */
    public addScore(points: number): void {
        if (points <= 0) return;
        
        // 确保分数为整数
        points = Math.floor(points);
        
        // 更新分数
        this._score += points;
        
        // 打印日志
        console.log(`GameManager: 分数增加${points}，当前分数: ${this._score}`);
    }
    
    // 游戏状态访问器
    public get score(): number {
        return this._score;
    }
    
    public get isGameOver(): boolean {
        return this._isGameOver;
    }
    
    public get remainingTime(): number {
        return this._remainingTime;
    }
    
    // 其他游戏逻辑方法
    /**
     * 暂停游戏
     */
    public pauseGame(): void {
        console.log("游戏已暂停");
        this._isPaused = true;
        
        // 暂停游戏逻辑
        // 例如：暂停计时器，停止移动等
    }
    
    /**
     * 恢复游戏
     */
    public resumeGame(): void {
        console.log("游戏已恢复");
        this._isPaused = false;
        
        // 恢复游戏逻辑
        // 例如：恢复计时器，恢复移动等
    }
    
    /**
     * 重新开始游戏
     */
    public restartGame(): void {
        console.log("重新开始游戏");
        
        // 重置游戏状态
        this.resetGame();
        
        // 确保游戏状态正确
        this._isPaused = false;
        this._isGameOver = false;
        this._remainingTime = this.maxTime;
        
        console.log("游戏已重新开始，分数:", this._score, "时间:", this._remainingTime);
    }
} 